package com.jdk.demo.thread.condition;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class TaskQueue {

    //1. 创建等待队列
    final Queue<String> queue= new LinkedList<>();

    //2. 创建可重入锁
    final Lock lock=new ReentrantLock();

    //3. 利用可重入锁创建Condition对象
    final Condition condition=lock.newCondition();

    //4. 获取任务队列中的任务名称
    public  String getTask() throws InterruptedException {
        lock.lock();
        //如果队列为空，则线程进入等待状态
        while(this.queue.isEmpty()){
            try {
                condition.await();  //调用notEmpty.await(); 让线程进入等待状态
                // 这里到时间释放后会再次进入循环，这会已经没有锁了，调用await会报错
            	// condition.await(100, TimeUnit.MILLISECONDS);
                System.out.println("释放");
            } finally {
                lock.unlock();
            }
        }
        return  queue.remove();
    }

    //5. 往队列中添加任务
    public  void  addTask(String name){
        lock.lock();
        //为队列添加一个任务
        this.queue.add(name);
        try {
            condition.signalAll();  //唤醒所有正在等待的线程
        }finally {
            lock.unlock();
        }

    }

}